<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="renderer" content="webkit">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <meta name="google-site-verification" content="TZE0rZyIqLl10trYu3BWBWa1Vmz6HFwhb2OcNEK4u-s" />
     <link rel="shortcut icon" href= /blog/img/favicon.ico >
    <title>
        cq’博客
    </title>
    <meta name="description" content= 嘿，我是程崎。欢迎访问！ >
    <meta name="keywords" content=  >
    
<link rel="stylesheet" href="/blog/libs/highlight/styles/monokai-sublime.css">

    
<link rel="stylesheet" href="/blog/libs/font-awesome/css/font-awesome.min.css">

    
<link rel="stylesheet" href="/blog/css/style.css">

<meta name="generator" content="Hexo 5.4.0"></head>
<body id="bodyx">
    <div class="hd posts">
    <a href="/blog/index.html"><i class="fa fa-home
 replay-btn" aria-hidden="true"></i></a>
    <div class="post-title">
        <p>
            深入学习Spring理论知识
        </p>
        <hr>
    </div>
    <div class="post-content">
        <h2 id="BeanDefinition"><a href="#BeanDefinition" class="headerlink" title="BeanDefinition"></a>BeanDefinition</h2><h3 id="什么是BeanDefinition"><a href="#什么是BeanDefinition" class="headerlink" title="什么是BeanDefinition"></a>什么是BeanDefinition</h3><ol>
<li>BeanDefinition表示Bean定义</li>
<li>Spring根据BeanDefinition来创建Bean对象</li>
<li>BeanDefinition有很多的属性用来描述Bean</li>
<li>BeanDefinition是Spring中非常核心的概念</li>
</ol>
<h3 id="BeanDefinition中重要的属性"><a href="#BeanDefinition中重要的属性" class="headerlink" title="BeanDefinition中重要的属性"></a>BeanDefinition中重要的属性</h3><ol>
<li><p>beanclass</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">表示一个bean的类型，比如：UserService.class、OrderService.class,Spring在创建Bean的过程中会根据此属性来实例化得到对象</span><br></pre></td></tr></table></figure></li>
<li><p>scope</p>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">表示一个bean的作用域，比如：</span><br><span class="line">如果scope等于singleton，那么该bean就是一个单例Bean;</span><br><span class="line">如果scope等于prototype，那么该bean就是一个原型Bean。</span><br></pre></td></tr></table></figure></li>
<li><p>isLazy</p>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">表示一个bean是否需要懒加载，原型bean的isLazy属性不起作用，懒加载的单例bean，会在第一次getBean的时候生成该bean，非懒加载的单例bean，则会在Spring启动过程中直接生成</span><br></pre></td></tr></table></figure></li>
<li><p>dependsOn</p>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">表示一个bean在创建之前所依赖的其他bean，在一个bean创建之前,它所依赖的这些bean得先全部创建好</span><br></pre></td></tr></table></figure></li>
<li><p>primary</p>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">表示一个bean是主bean，在Spring中一个类型可以有多个bean对象，在进行依赖注入的时候，如果根据类型找到了多个bean，此时会判断这些bean中是否存在一个主bean，如果存在，则直接将这个bean注入给属性</span><br></pre></td></tr></table></figure></li>
<li><p>initMethodName</p>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">表示一个bean的初始化方法，一个bean的生命周期过程中有一个步骤叫做初始化，Spring会在这个步骤中去调用bean的初始化方法，初始化逻辑由程序员自己控制，表示程序员可以自定义逻辑对bean进行加工</span><br></pre></td></tr></table></figure></li>
</ol>
<h2 id="BeanFactory"><a href="#BeanFactory" class="headerlink" title="BeanFactory"></a>BeanFactory</h2><h3 id="什么是BeanFactory"><a href="#什么是BeanFactory" class="headerlink" title="什么是BeanFactory"></a>什么是BeanFactory</h3><figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">BeanFactory是一种&quot;Spring容器&quot;，</span><br><span class="line">BeanFactory翻译过来就是Bean工厂，</span><br><span class="line">顾名思义，它是可以用来创建Bean、获取Bean，</span><br><span class="line">BeanFactory是Spring中非常核心的组件。</span><br></pre></td></tr></table></figure>



<h3 id="BeanDefinition、BeanFactory、Bean对象之间的关系"><a href="#BeanDefinition、BeanFactory、Bean对象之间的关系" class="headerlink" title="BeanDefinition、BeanFactory、Bean对象之间的关系"></a>BeanDefinition、BeanFactory、Bean对象之间的关系</h3><ol>
<li>BeanFactory将利用BeanDefinition来生成Bean对象</li>
<li>BeanDefinition相当于BeanFactory的原材料</li>
<li>Bean对象就相当于BeanFactory所生产出来的产品</li>
</ol>
<h3 id="BeanFactory的核心子接口和实现类"><a href="#BeanFactory的核心子接口和实现类" class="headerlink" title="BeanFactory的核心子接口和实现类"></a>BeanFactory的核心子接口和实现类</h3><ol>
<li>ListableBeanFactory</li>
<li>ConfigurationBeanFactory</li>
<li>AutoWireCapableBeanFactory</li>
<li>AbstractBeanFactory</li>
<li>DefaultListableBeanFactory</li>
</ol>
<h4 id="DefaultListableBeanFactory的功能"><a href="#DefaultListableBeanFactory的功能" class="headerlink" title="DefaultListableBeanFactory的功能"></a>DefaultListableBeanFactory的功能</h4><ul>
<li>支持单例Bean</li>
<li>支持Bean别名</li>
<li>支持父子BeanFactory</li>
<li>支持Bean类型转化</li>
<li>支持Bean后置</li>
<li>支持FactoryBean</li>
<li>支持自动装配</li>
<li>等等</li>
</ul>
<h2 id="Bean的生命周期"><a href="#Bean的生命周期" class="headerlink" title="Bean的生命周期"></a>Bean的生命周期</h2><h3 id="什么是Bean生命周期"><a href="#什么是Bean生命周期" class="headerlink" title="什么是Bean生命周期"></a>什么是Bean生命周期</h3><figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Bean生命周期描述的是Spring中一个Bean创建过程和销毁过程中所经历的步骤，其中Bean创建过程是重点。</span><br><span class="line">程序员可以利用Bean生命周期机制对Bean进行自定义加工</span><br></pre></td></tr></table></figure>



<h3 id="Bean周期中的核心步骤"><a href="#Bean周期中的核心步骤" class="headerlink" title="Bean周期中的核心步骤"></a>Bean周期中的核心步骤</h3><ol>
<li><p>BeanDefinition对象创建</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">BeanDefinition表示Bean定义，它定义了某个Bean的类型，Spring就是利用BeanDefinition来创建Bean的，比如需要利用BeanDefinition中BeanClass属性确定Bean类型，从而实例化出来对象。</span><br></pre></td></tr></table></figure></li>
<li><p>构造方法推断</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">一个Bean中可以有多个构造方法，此时就需要Spring来判断到底使用哪个构造方法，如果一个类只有一个构造方法，那没的选择，只能用这个构造方法，如果一个类有多个构造方法，首先会判断是否有@Autowired指定构造方法，再看是否有无参构造方法。如果都没有就会报错 No default constructor found。通过构造方法推断之后确定一个构造方法后，就可以利用构造方法实例化得到一个对象了。</span><br></pre></td></tr></table></figure></li>
<li><p>实例化</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">通过构造方法反射得到一个实例化对象，在Spring中，可以通过BeanPostProcessor机制对实例化进行干预</span><br></pre></td></tr></table></figure></li>
<li><p>属性填充</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">实例化所得到的对象，是“不完整”的对象，“不完整”的意思是该对象中的某些属性还没有进行属性填充，也就是Spring还没有自动给某些属性赋值，属性填充也就是我们通常所说的自动注入，依赖注入。</span><br></pre></td></tr></table></figure></li>
<li><p>初始化</p>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">在一个对象的属性填充之后，Spring提供了初始化机制，程序员可以利用初始化机制对的Bean进行自定义加工，比如可以利用InitialzingBean接口来对Bean中的其他属性进行赋值，或对Bean中的某些属性进行校验</span><br></pre></td></tr></table></figure></li>
<li><p>初始化后</p>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">初始化后是Bean创建生命周期中最后一个步骤，我们常说的AOP机制，就是在这个步骤中通过BeanPostProcessor机制实现的，初始化之后得到的对象才是真正的Bean对象。</span><br></pre></td></tr></table></figure></li>
</ol>
<h2 id="Autowired"><a href="#Autowired" class="headerlink" title="@Autowired"></a>@Autowired</h2><h3 id="Autowired是什么"><a href="#Autowired是什么" class="headerlink" title="@Autowired是什么"></a>@Autowired是什么</h3><figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@Autowired表示某个属性是否需要进行依赖注入，可以写在属性和方法上。注解中的required属性默认为true，表示如果没有对象可以注入给属性则抛出异常。</span><br></pre></td></tr></table></figure>



<h3 id="Autowired的工作流程"><a href="#Autowired的工作流程" class="headerlink" title="@Autowired的工作流程"></a>@Autowired的工作流程</h3><blockquote>
<p>完整的底层筛选逻辑步骤是更多的，不仅仅只有这两步</p>
</blockquote>
<h4 id="Autowired加在某个属性上"><a href="#Autowired加在某个属性上" class="headerlink" title="@Autowired加在某个属性上"></a>@Autowired加在某个属性上</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">OrderService</span></span>&#123;</span><br><span class="line">    </span><br><span class="line">    <span class="meta">@Autowired</span></span><br><span class="line">    <span class="keyword">private</span> UserService userService;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@Autowired加在某个属性上，Spring在进行Bean的生命周期过程中，在属性填充这一步，会基于实例化出来的对象，对该对象中加了@Autowired的属性自动给属性赋值。</span><br></pre></td></tr></table></figure>

<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Spring会根据属性的类型去Spring容器中找出该类型所有的Bean对象，如果找出来多个，则再根据属性的名字从多个中再确定一个。如果required属性为true，并且根据属性信息找不到对象，则直接抛出异常</span><br></pre></td></tr></table></figure>



<h4 id="Autowired加在某个方法上"><a href="#Autowired加在某个方法上" class="headerlink" title="@Autowired加在某个方法上"></a>@Autowired加在某个方法上</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">OrderService</span></span>&#123;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">private</span> UserService userService;</span><br><span class="line">    </span><br><span class="line">    <span class="meta">@Autowired</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setUserService</span><span class="params">(UserService userService)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.userService = userService;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">当@Autowired注解写在某个方法上时，Spring在Bean生命周期的属性填充阶段，会根据方法的参数类型、参数名称从Spring容器找到对象当做方法入参，自动反射调用该方法。</span><br></pre></td></tr></table></figure>



<h4 id="Autowired加在构造方法方法上"><a href="#Autowired加在构造方法方法上" class="headerlink" title="@Autowired加在构造方法方法上"></a>@Autowired加在构造方法方法上</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">OrderService</span></span>&#123;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">private</span> UserService userService;</span><br><span class="line">    </span><br><span class="line">    <span class="meta">@Autowired</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">OrderService</span><span class="params">(UserService userService)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.userService = userService;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">OrderService</span><span class="params">(UserService userService, UserService userService)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.userService = userService;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@Autowired加在构造方法上时，Spring会在推断构造方法阶段，选择该构造方法进行实例化，在反射调用构造方法之前，会先根据构造方法参数类型，参数名从Spring容器中找到Bean对象，当做构造方法入参。</span><br></pre></td></tr></table></figure>



<h2 id="Resource"><a href="#Resource" class="headerlink" title="@Resource"></a>@Resource</h2><h3 id="Resource是什么"><a href="#Resource是什么" class="headerlink" title="@Resource是什么"></a>@Resource是什么</h3><figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@Resource注解与@Autowired类似，也是用来用来进行依赖注入的，@Resource是Java层面所提供的注解，@Autowired是Spring所提供的注解，它们依赖注入的底层实现逻辑也不同。</span><br></pre></td></tr></table></figure>



<h3 id="Resource的工作流程"><a href="#Resource的工作流程" class="headerlink" title="@Resource的工作流程"></a>@Resource的工作流程</h3><blockquote>
<p>@Resource注解中有一个name属性，针对name属性是否有值，@Resource的依赖注入底层流程是不同的</p>
</blockquote>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@Resource如果name属性有值，那么Spring会直接根据所指定的name值去Spring容器找Bean对象，如果找到了则成功，如果没有找到，则报错</span><br></pre></td></tr></table></figure>

<blockquote>
<p>@Resource如果name属性没有值</p>
</blockquote>
<ol>
<li>先判断该属性名字在Spring容器中是否存在Bean对象。</li>
<li>如果存在，则成功找到Bean对象进行注入。</li>
<li>如果不存在，则根据属性类型去Spring容器找Bean对象，找到一个则进行注入。</li>
</ol>
<h2 id="Value"><a href="#Value" class="headerlink" title="@Value"></a>@Value</h2><h3 id="Value是什么"><a href="#Value是什么" class="headerlink" title="@Value是什么"></a>@Value是什么</h3><figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@Value注解和@Resource、@Autowired类似，也是用来对属性进行依赖注入的，只不过@Value是用来从Properties文件中来获取值的，并且@Value可以解析SpEl（Spring表达式）。</span><br></pre></td></tr></table></figure>



<h3 id="Value的工作流程"><a href="#Value的工作流程" class="headerlink" title="@Value的工作流程"></a>@Value的工作流程</h3><blockquote>
<p>@Value(“cq”)</p>
</blockquote>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">直接将字符串&quot;cq&quot;赋值给属性，如果属性类型不是String，或无法进行类型转化，则报错。</span><br></pre></td></tr></table></figure>

<blockquote>
<p>@Value(“${cq}”)</p>
</blockquote>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">将会把<span class="built_in">$</span>&#123;&#125;中的字符串当做key，从Properties文件中找出对应的value赋值给属性，如果没找到，则会把&quot;<span class="built_in">$</span>&#123;cq&#125;&quot;当做普通字符串注入给属性</span><br></pre></td></tr></table></figure>

<blockquote>
<p>@Value(“#{cq}”)</p>
</blockquote>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">会将<span class="params">#</span>&#123;&#125;中的字符串当做Spring表达式进行解析，Spring会把&quot;cq&quot;当做beanName，并从Spring容器中找对应bean，如果找到则进行属性注入，没找到则报错。</span><br></pre></td></tr></table></figure>



<h2 id="FactoryBean"><a href="#FactoryBean" class="headerlink" title="FactoryBean"></a>FactoryBean</h2><h3 id="FactoryBean是什么"><a href="#FactoryBean是什么" class="headerlink" title="FactoryBean是什么"></a>FactoryBean是什么</h3><figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">FactoryBean是Spring所提供的一种较灵活的创建Bean的方式，可以通过实现FactoryBean接口中的getObject()方法来返回一个对象，这个对象就是最终的Bean对象。</span><br></pre></td></tr></table></figure>



<h3 id="FactoryBean接口中的方法"><a href="#FactoryBean接口中的方法" class="headerlink" title="FactoryBean接口中的方法"></a>FactoryBean接口中的方法</h3><ol>
<li><p>Object getObject()：返回的是Bean对象</p>
</li>
<li><p>boolean isSingleton()：判断返回的是否为单例Bean对象</p>
</li>
<li><p>Class getObjectType()：返回的是Bean对象的类型</p>
</li>
</ol>
<h3 id="FactoryBean的特殊点"><a href="#FactoryBean的特殊点" class="headerlink" title="FactoryBean的特殊点"></a>FactoryBean的特殊点</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Component(&quot;cq&quot;)</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">CqFactoryBean</span> <span class="keyword">implements</span> <span class="title">FactoryBean</span></span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="comment">// Bean对象</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> Object <span class="title">getObject</span><span class="params">()</span> <span class="keyword">throws</span> Exception </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> User();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="comment">// Bean对象的类型</span></span><br><span class="line">    <span class="keyword">public</span> Class&lt;?&gt; getObjectType() &#123;</span><br><span class="line">        <span class="keyword">return</span> User.class;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="comment">// 所定义的Bean是单例还是原型</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isSingleton</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<blockquote>
<p>上述代码，实际上对应了两个Bean对象：</p>
</blockquote>
<ol>
<li>beanName为”cq”，bean对象为getObject方法所返回的User对象。</li>
<li>beanName为”&amp;cq”，bean对象为CqFactoryBean类实例对象。</li>
</ol>
<h2 id="FactoryBean与BeanFactory的区别"><a href="#FactoryBean与BeanFactory的区别" class="headerlink" title="FactoryBean与BeanFactory的区别"></a>FactoryBean与BeanFactory的区别</h2><h3 id="FactoryBean-1"><a href="#FactoryBean-1" class="headerlink" title="FactoryBean"></a>FactoryBean</h3><blockquote>
<p>FactoryBean对象本身也是一个Bean，同时它相当于一个小型工厂，可以生产出另外的Bean。</p>
</blockquote>
<h3 id="BeanFactory-1"><a href="#BeanFactory-1" class="headerlink" title="BeanFactory"></a>BeanFactory</h3><blockquote>
<p>BeanFactory是一个Spring容器，是一个大型工厂，它可以生产出各种各样的Bean。</p>
</blockquote>
<h2 id="ApplicationContext"><a href="#ApplicationContext" class="headerlink" title="ApplicationContext"></a>ApplicationContext</h2><h3 id="ApplicationContext是什么"><a href="#ApplicationContext是什么" class="headerlink" title="ApplicationContext是什么"></a>ApplicationContext是什么</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ApplicationContext是比BeanFactory更加强大的Spring容器，它既可以创建bean、获取bean，还支持国际化、事件广播、获取资源等BeanFactory不具备的功能。</span><br></pre></td></tr></table></figure>



<h3 id="ApplicationContext所继承的接口"><a href="#ApplicationContext所继承的接口" class="headerlink" title="ApplicationContext所继承的接口"></a>ApplicationContext所继承的接口</h3><ul>
<li><p>EnvironmentCapable</p>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ApplicationContext继承了这个接口，表示拥有了获取环境变量的功能，可以通过ApplicationContext获取操作系统环境变量和JVM环境变量。</span><br></pre></td></tr></table></figure></li>
<li><p>ListableBeanFactory</p>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ApplicationContext继承了这个接口，就拥有了获取所有beanNames、判断某个beanName是否存在beanDefinition对象、统计BeanDefinition个数、获取某个类型对应的所有beanNames等功能。</span><br></pre></td></tr></table></figure></li>
<li><p>HierarchicalBeanFactory</p>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ApplicationContext继承了这个接口，就拥有了获取父BeanFactory、判断某个name是否存在bean对象的功能。</span><br></pre></td></tr></table></figure></li>
<li><p>MessageSource</p>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ApplicationContext继承了这个接口，就拥有了国际化功能，比如可以直接利用MessageSource对象获取某个国际化资源(比如不同国家语言所对应的字符)</span><br></pre></td></tr></table></figure></li>
<li><p>ApplicationEventPublisher</p>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ApplicationContext继承了这个接口，就拥有了事件发布功能，可以发布事件，这是ApplicationContext相对于BeanFactory比较突出、常用的功能。</span><br></pre></td></tr></table></figure></li>
<li><p>ResourcePatternResolver</p>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ApplicationContext继承了这个接口，就拥有了加载并获取资源的功能，这里的资源可以是文件，图片等某个URL资源都可以。</span><br></pre></td></tr></table></figure></li>
</ul>
<h2 id="BeanPostProcessor"><a href="#BeanPostProcessor" class="headerlink" title="BeanPostProcessor"></a>BeanPostProcessor</h2><h3 id="BeanPostProcessor是什么"><a href="#BeanPostProcessor是什么" class="headerlink" title="BeanPostProcessor是什么"></a>BeanPostProcessor是什么</h3><blockquote>
<p>BeanPostProcessor是Spring所提供的一种扩展机制，可以利用该机制对Bean进行定制化加工，在Spring底层源码实现中，也广泛的用到了该机制，BeanPostProcessor通常也叫做Bean后置处理器。</p>
</blockquote>
<figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">BeanPostProcessor在Spring中是- -个接口，我们定义- -个后置处理器，就是提供- -个类实现该接口，在Spring中还存在一些接口继承了BeanPostProcessor,这些子接口是在BeanPostProcessor的基础.上增加了一些其他的功能。</span><br></pre></td></tr></table></figure>



<h3 id="BeanPostProcessor中的方法"><a href="#BeanPostProcessor中的方法" class="headerlink" title="BeanPostProcessor中的方法"></a>BeanPostProcessor中的方法</h3><ol>
<li>postProcessBeforelnitialization()：初始化前方法，表示可以利用这个方法来对Bean在初始化前进行自定义加工。</li>
<li>postProcessAfterlnitialization()：初始化后方法，表示可以利用这个方法来对Bean在初始化后进行自定义加工。</li>
</ol>
<h3 id="InstantiationAwareBeanPostProcessor"><a href="#InstantiationAwareBeanPostProcessor" class="headerlink" title="InstantiationAwareBeanPostProcessor"></a>InstantiationAwareBeanPostProcessor</h3><blockquote>
<p>BeanPostProcessor的一个子接口</p>
</blockquote>
<ul>
<li>postProcessBeforeInstantiation()：实例化前</li>
<li>postProcessAfterInstantiation()：实例化后</li>
<li>postProcessProperties()：属性注入后</li>
</ul>
<h2 id="AOP"><a href="#AOP" class="headerlink" title="AOP"></a>AOP</h2><h3 id="AOP是什么"><a href="#AOP是什么" class="headerlink" title="AOP是什么"></a>AOP是什么</h3><blockquote>
<p>AOP就是面向切面编程，是一种非常适合在无需修改业务代码的前提下，对某个或某些业务增加统一的功能，比如日志记录、权限控制、事务管理等，能很好的使得代码解耦，提高开发效率。</p>
</blockquote>
<h3 id="AOP中的核心概念"><a href="#AOP中的核心概念" class="headerlink" title="AOP中的核心概念"></a>AOP中的核心概念</h3><ol>
<li><p>Advice</p>
<p>Advice可以理解为通知、建议，在Spring中通过定义Advice来定义代理逻辑。</p>
</li>
<li><p>Pointcut</p>
</li>
</ol>
<p>​        Pointcut是切点，表示Advice对应的代理逻辑应用在哪个类、哪个方法上。</p>
<ol start="3">
<li><p>Advisor</p>
<p>Advisor等于Advice+Pointcut,表示代理逻辑和切点的一个整体，程序员可以通过定义或封装个Advisor, 来定义切点和代理逻辑。</p>
</li>
</ol>
<ol start="3">
<li><p>Weaving</p>
<p>Weaving表示织入，将Advice代理逻辑在源代码级别嵌入到切点的过程，就叫做织入。</p>
</li>
<li><p>Target</p>
<p>Target表示目标对象，也就是被代理对象，在AOP生成的代理对象中会持有目标对象。</p>
</li>
<li><p>Join Point</p>
<p>Join Point表示连接点，在Spring AOP中，就是方法的执行点。</p>
</li>
</ol>
<h3 id="AOP的工作原理"><a href="#AOP的工作原理" class="headerlink" title="AOP的工作原理"></a>AOP的工作原理</h3><blockquote>
<p>AOP是发生在Bean的生命周期过程中的</p>
</blockquote>
<ol>
<li>Spring生成bean对象时，先实例化出来个对象，也就是target对象</li>
<li>再对target对象进行属性填充</li>
<li>在初始化后步骤中，会判断target对象有没有对应的切面</li>
<li>如果有切面，就表示当前target对象需要进行AOP</li>
<li>通过Cglib或JDK动态代理机制生成-个代理对象，作为最终的bean对象</li>
<li>代理对象中有一-个target属性指向了target对象</li>
</ol>

    </div>

    
</div>
    <div class="footer" id="footer">
    <p><h4>Copyright © 2020 | Author: 程崎 | Theme By <a class="theme-author" target="_blank" rel="noopener" href="https://github.com/Xunzhuo/hexo-theme-coder" style="font-size:14px; color: #969696">Coder</a></h4>
    <label class="el-switch el-switch-blue el-switch-sm" style="vertical-align: sub;">
        <input type="checkbox" name="switch" id="update_style">
        <span class="el-switch-style"></span>
    </label>
    <!--         <script type="text/javascript">
    var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");
    document.write(unescape("%3Cspan id='cnzz_stat_icon_1278548644'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "v1.cnzz.com/stat.php%3Fid%3D1278548644%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));
    </script> -->
</p>
</div>
<input type="hidden" id="web_style" value="black">
<input type="hidden" id="valine_appid" value="NOsswOncKgc8HOxqo9oxIWlX-gzGzoHsz">
<input type="hidden" id="valine_appKey" value="z1FihjWEbS8uIfUQdmCtK7zz">

<script src="/blog/libs/jquery.min.js"></script>


<script src="/blog/libs/highlight/highlight.pack.js"></script>

<script src='//cdn.jsdelivr.net/npm/valine@1.3.10/dist/Valine.min.js'></script>

<script src="/blog/js/js.js"></script>

<style type="text/css">
.v * {
color: #698fca;
}
.v .vlist .vcard .vhead .vsys {
color: #3a3e4a;
}
.v .vlist .vcard .vh .vmeta .vat {
color: #638fd5;
}
.v .vlist .vcard .vhead .vnick {
color: #6ba1ff;
}
.v a {
color: #8696b1;
}
.v .vlist .vcard .vhead .vnick:hover {
color: #669bfc;
}
</style>
    <script type="text/javascript" color="173,174,173" opacity='1' zIndex="-2" count="99" src="//cdn.bootcss.com/canvas-nest.js/1.0.0/canvas-nest.min.js"></script>
</body>
</html>
